home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Games Extra 1996 June
/
Amiga Games Extra 1996 #6.iso
/
userbox
/
publicdomain
/
apcopy
/
apcopy.doc
< prev
next >
Wrap
Text File
|
1996-02-24
|
13KB
|
354 lines
;
; APCopy
; ------
;
; This program was put together because I wanted a simple and fast
; file copier. It has no bells and whistles but does contain
; some rudimentary error checking just in case the user is
; overdoing the apple brandy sauce. It goes something like this...
;
; Get some memory
; Open dos and intuition
; Check we've got CLI parameters
; Open the files
; Copy the source file
; Close the files
; Free the memory
; Close dos and intuition
; Exit
;
; I used PhxAss/PhxLnk to put this together, plus CED and some
; other programs I should mention.
;
; I hope the annotations are of some use.
;
; Anthony Peck
; 68 Woralul St
; Waramanga ACT 2611
;
; E-mail: Anthony.Peck@Radford.act.edu.au
;
; 18 DEC 1995
;
; -----------------------------------------------------------------
; -----------------------------------------------------------------
; First some definitions to make the source code a little easier
; to read (I hope).
; Memory allocation for AllocMem function
MKBUFFER = 0 ; The start of the memory block
MKSOURCE = 512 ; The start of the source buffer
MKDESTINATION = 612 ; The start of the dest buffer
MKDOSBASE = 712 ; The start of dosbase (long)
MKINTUITIONBASE = 716 ; The start of intuitionbase (long)
MKINFILEHD = 720 ; The start of the infile handle
MKOUTFILEHD = 724 ; The start of the outfile handle
TOTALMEM = 728 ; The total memory required
; Simple equivalents
Execbase = $04 ; ExecBase (!)
Mode_OLDFILE = $03ED ; Access mode for open file
Mode_NEWFILE = $03EE ; Access mode for open file
LF = $0A ; Linefeed
; Library Vector Offsets
_LVOOpenlibrary = -$0228 ; Exec function
_LVOCloselibrary = -$019E ; Exec function
_LVOOpen = -$1E ; Dos function
_LVOOutput = -$3C ; Dos function
_LVOClose = -$24 ; Dos function
_LVORead = -$2A ; Dos function
_LVOWrite = -$30 ; Dos function
_LVOAllocmem = -$C6 ; Dos function
_LVOFreemem = -$D2 ; Dos function
_LVOAutorequest = -$015C ; Intuition function
; Next some Macros to call on, easing the pain of library calls.
EXEC MACRO
Move.l Execbase,A6 ; Move Exec into a6
Jsr _LVO\1(A6) ; Call function
ENDM
CALLINT MACRO
Move.l MKINTUITIONBASE(A4),A6 ; Move Intuition into a6
Jsr _LVO\1(A6) ; Call function
ENDM
CALLDOS MACRO
Move.l MKDOSBASE(A4),A6 ; Move Dos into a6
Jsr _LVO\1(A6) ; Call function
ENDM
; The real code starts here
start:
Sub.B #$01,D0 ; Subtract the first parameter
Move.l D0,D5 ; Move the number remaining to D5
Move.l A0,A5 ; Move the parameter address to A5
GetMem:
Move.l #TOTALMEM,d0 ; The total memory required
Move.l #0,d1 ; Any mem will do (we clear it anyway)
EXEC Allocmem ; Go get it
Beq Exit ; Whoops, off we go
Move.l D0,A4 ; All OK, so transfer to A4
CleanMem:
; Just in case we're a bit dirty.
Move.l A4,A3 ; Move the dirty stuff to A3
Move.l #TOTALMEM-1,D0 ; Counter minus 1
1$ Move.b #0,(A3)+ ; Clear a byte and move it
Dbf D0,1$ ; If not zero yet then go back
Openint:
; Opening intuition (needed for Autorequest). The return address
; stored in the appropriate location of the reserved memory.
Lea Intname,A1 ; Load library name
EXEC Openlibrary ; Macro opens library
Beq Freemem ; If it doesn't open, we quit
Move.l D0,MKINTUITIONBASE(A4) ; Save the return address
Opendos:
; Ditto for the Dos library
Lea Dosname,A1 ; Load dos library into a1
Move.l #$00,D0 ; Any version will do
EXEC Openlibrary ; Macro opens library
Beq Nodos ; If there's a problem, close down
Move.l D0,MKDOSBASE(A4) ; Save the return address
CheckParam:
; Now, did the user actually give us any parameters?
Tst.L D5 ; anyone home?
Beq Usage ; No, so display Usage message
Lea MKSOURCE(A4),A0 ; Load the source buffer
Lea MKDESTINATION(A4),A1 ; Load the dest buffer
1$
Move.b (a5)+,D0 ; Transfer a byte
Cmp.b #$20,D0 ; Is it a space?
Beq 2$ ; Yep, so go on
Cmp.b #$0A,D0 ; Is it a Linefeed?
Beq Usage ; Yep, a bit early so outta here
Cmp.b #$00,D0 ; Is it nothing?
Beq Usage ; Yep, got real probs now!
Move.b d0,(a0)+ ; Else move it to source buffer
Bra 1$ ; and back for next character
2$
Move.b (a5)+,D0 ; Transfer a byte
Cmp.b #$00,d0 ; Is it nothing?
Beq Usage ; Oops, gone now.
Cmp.b #$0A,D0 ; Is it a linefeed?
Beq Openfiles ; Yep so finished parameters
Move.b d0,(a1)+ ; Else move it to dest buffer
Bra 2$ ; and back for another one
Openfiles:
; At this stage, theory is that all is well and we can press on
; with the file opening. I do it slightly weirdingly (?), because
; I like to check to see if the destination file exists, and then
; give the user and opportunity to bug out.
Lea MKSOURCE(A4),A0 ; Source file address to A0
Move.l A0,D1 ; and move it to D1
Move.l #Mode_OLDFILE,D2 ; Opening as an existing file
CALLDOS Open ; Macro calls open function
Beq Closedos ; Oops, outta here!
Move.l D0,MKINFILEHD(A4) ; Save the infile handle
Lea MKDESTINATION(A4),A0 ; Dest file address to A0
Move.l A0,D1 ; and move it to D1
Move.l #Mode_OLDFILE,D2 ; Opening as a old file first
CALLDOS Open ; Macro calls open function
Move.l D0,MKOUTFILEHD(A4) ; Save the file handle
Tst.b D0 ; Test if file already exists
Beq 1$ ; If "NO" then move on ->
Move.l #$00,A0 ; else we start the AutoReq code
Lea Atext,A1 ; The main body text to A1
Lea Ltext,A2 ; ...and the left text to A2
Lea Rtext,A3 ; ...and the right text to A3
Move.l #$00,D0 ; left button clicked
Move.l #$00,D1 ; right button clicked
Move.l #$C4,D2 ; requester length
Move.l #$35,D3 ; requester height
CALLINT Autorequest ; call the requester
Tst.b D0 ; Test if right button selected
Beq 1$ ; Yes...so move on
; Closing the files prior to bugout!
Move.l MKINFILEHD(A4),D1 ; Infilehandle
CALLDOS Close ; ...and closed
Move.l MKOUTFILEHD(A4),D1 ; Outfile handle
CALLDOS Close ; ...and closed
Bra Closedos ; Outtahere
; Let's try all that again!
1$ Move.l MKOUTFILEHD(A4),D1 ; Load the outfile handle
CALLDOS Close ; Macro calls function
Lea MKDESTINATION(A4),A0 ; Load address of dest file to A0
Move.l A0,D1 ; and move it to D1
Move.l #Mode_NEWFILE,D2 ; Opening as a new file
CALLDOS Open ; Macro calls open function
Bne 2$ ; All OK so move along
Move.l MKINFILEHD(A4),D1 ; If error load infile handle...
CALLDOS Close ; ...and close the file...
Bra Closedos ; ...and gone
2$ Move.l D0,MKOUTFILEHD(A4) ; Else save the outfile handle
Copying:
; The files are open, the birds are singing and it's time for this
; program to earn its keep.
Lea MKBUFFER(A4),A0 ; Address of buffer to A0
Move.l A0,D2 ; and move it to D1
Move.l MKINFILEHD(A4),D1 ; Infile handle to D1
Move.l #512,D3 ; Size of buffer to D3
CALLDOS Read ; Read it!
Beq Closefiles ; Oops! I'm gone
Lea MKBUFFER(A4),A0 ; Address of buffer to A0
Move.l A0,D2 ; and move it to D2
Move.l MKOUTFILEHD(A4),D1 ; Outfile handle to D1
Move.l D0,D3 ; Size of last read to D3
CALLDOS Write ; Macro Writes to file
Beq Closefiles ; No joy so gone...
Bra Copying ; else back for another read
Closefiles:
; Phew! After all that hard work I'll do the dishes and clean up the
; kitchen.
Move.l MKINFILEHD(A4),D1 ; Load the infile handle
CALLDOS Close ; Macro calls function
Move.l MKOUTFILEHD(A4),D1 ; Load the outfile handle
CALLDOS Close ; Macro calls function
Bra Closedos ; Then go
Usage:
; Here we tell the user how to use the program just in case they come
; from the planet Urgania.
Calldos Output ; Call the output function
Beq Closedos ; No can do, so outta here ->
Move.l D0,D1 ; else shift output handle to D1
Move.l #Message,D2 ; Load message...
Move.l #SZMess,D3 ; ...plus its length...
Calldos Write ; ..and write it
Closedos:
; Closes the dos library!
Move.l MKDOSBASE(A4),A1 ; Move dos base into a1
EXEC Closelibrary ; Macro closes dos
Nodos:
; Closes the intuition library!
Move.l MKINTUITIONBASE(A4),A1 ; Move intuition base into a1
EXEC Closelibrary ; Macro closes intuition
Freemem:
; Just some memory housekeeping.
Move.l a4,a1 ; Move the buffer to A1
Move.l #TOTALMEM,d0 ; and its size
EXEC Freemem ; and be free!
Exit:
; Sadly now we sing again to each and every one. Gladly we'll come
; back and all have more fun.
Clr.L D0 ; Clear D0
Rts ; Return To System
Atext:
; Intuitext structure
DC.B $02,$01,$01 ; FrontPen,BackPen,DrawMode
Even ; Fill to make even address for word
DC.W $0D,$08 ; Left edge, top edge
DC.L $00 ; No special font
DC.L Atx ; The actual text
DC.L $00 ; No next text
Ltext:
; Intuitext structure
DC.B $02,$01,$01 ; FrontPen,BackPen,DrawMode
Even ; Fill to make even address for word
DC.W $06,$03 ; Left edge, top edge
DC.L $00 ; No special font
DC.L Ltx ; The actual text
DC.L $00 ; No next text
Rtext:
; Intuitext structure
DC.B $02,$01,$01 ; FrontPen,BackPen,DrawMode
Even ; Fill to make even address for word
DC.W $06,$03 ; Left edge, top edge
DC.L $00 ; No special font
DC.L Rtx ; The actual text
DC.L $00 ; No next text
; Some final definitions
Atx: DC.B "Copy over old file?",$00
Ltx: DC.B "No",$00
Rtx: DC.B "Yes",$00
Intname: DC.B "intuition.library",0
Dosname: DC.B "dos.library",0
Message:
Dc.B LF," " ;
Dc.B "Usage:
APCopy
" ;
Dc.B " <source> <destination> " ; Text of message
Dc.B "
A N Peck - 1995
" ;
Dc.B LF,LF ;
SZMess = *-Message ; Size of message
END